import 'dart:io';
import 'package:dio/dio.dart' as dio;
import 'package:flutter/foundation.dart';
import 'package:get/get.dart';
import '../services/dio_service.dart';
import '../models/index.dart';

/// 用户API调用类
/// 
/// 负责所有用户相关的API调用
/// 使用DioService进行网络请求，返回标准化的ApiResponse
/// 这是一个工具类，不是服务类
class UserApi {
  // 🔗 API路径常量
  static const String loginPath = '/auth/login';
  static const String logoutPath = '/auth/logout';
  static const String refreshTokenPath = '/auth/refresh';
  static const String userProfilePath = '/system/user/profile';
  static const String uploadAvatarPath = '/system/user/profile/avatar';
  static const String updateProfilePath = '/system/user/profile';
  
  // 📡 网络服务实例
  static DioService get _dioService => Get.find<DioService>();
  
  /// 用户登录API
  /// 
  /// [request] 登录请求参数
  /// 返回包含TokenModel的ApiResponse
  static Future<ApiResponse<TokenModel>> login(LoginReq request) async {
    // 使用DioService发送请求（DioService已配置了baseUrl）
    // 错误处理由DioService统一处理，不在此处重复处理
    final response = await _dioService.post(
      loginPath,
      data: request.toJson(),
    );
    
    // 解析响应数据
    if (response.data != null && response.data is Map<String, dynamic>) {
      final responseData = response.data as Map<String, dynamic>;
      
      // 使用ApiResponse.fromJson解析，并提供TokenModel的fromJson方法
      return ApiResponse<TokenModel>.fromJson(
        responseData,
        fromJsonT: TokenModel.fromJson,
      );
    } else {
      return ApiResponse.error<TokenModel>(
        500,
        message: '服务器响应格式错误',
      );
    }
  }
  
  /// 刷新访问令牌API
  /// 
  /// [refreshToken] 刷新令牌
  /// 返回包含新TokenModel的ApiResponse
  static Future<ApiResponse<TokenModel>> refreshToken(String refreshToken) async {
    debugPrint('🔄 UserApi.refreshToken开始调用');
    debugPrint('🔄 刷新令牌长度: ${refreshToken.length}');
    
    // 构建刷新令牌请求参数
    final requestData = {
      'refreshToken': refreshToken,
    };
    
    debugPrint('🔄 准备发送刷新令牌请求到: $refreshTokenPath');
    
    try {
      // 使用DioService发送请求（DioService已配置了baseUrl）
      // 错误处理由DioService统一处理，不在此处重复处理
      final response = await _dioService.post(
        refreshTokenPath,
        data: requestData,
      );
      
      debugPrint('🔄 刷新令牌请求完成，状态码: ${response.statusCode}');
      
      // 解析响应数据
      if (response.data != null && response.data is Map<String, dynamic>) {
        final responseData = response.data as Map<String, dynamic>;
        
        debugPrint('🔄 刷新令牌响应数据: $responseData');
        
        // 使用ApiResponse.fromJson解析，并提供TokenModel的fromJson方法
        final apiResponse = ApiResponse<TokenModel>.fromJson(
          responseData,
          fromJsonT: TokenModel.fromJson,
        );
        
        debugPrint('🔄 ApiResponse解析完成，成功状态: ${apiResponse.isSuccess}');
        return apiResponse;
      } else {
        debugPrint('❌ 刷新令牌响应数据格式错误');
        return ApiResponse.error<TokenModel>(
          500,
          message: '服务器响应格式错误',
        );
      }
    } catch (e) {
      debugPrint('❌ UserApi.refreshToken异常: $e');
      rethrow;
    }
  }
  
  /// 获取用户个人信息API
  /// 
  /// 使用DioService自动携带的token获取当前用户详细信息
  /// 直接返回UserProfileModel
  static Future<UserProfileModel> getUserProfile() async {
    try {
      debugPrint('🔄 开始获取用户个人信息');
      
      // 使用DioService发送GET请求，token会被自动添加到请求头
      // 错误处理由DioService统一处理，不在此处重复处理
      final response = await _dioService.get(userProfilePath);
      
      // 解析响应数据
      if (response.data != null && response.data is Map<String, dynamic>) {
        final responseData = response.data as Map<String, dynamic>;
        
        // 检查响应状态码
        final code = responseData['code']?.toInt() ?? 0;
        final msg = responseData['msg']?.toString();
        
        if (code == 200) {
          // 成功响应 - 解析data字段为UserProfileModel
          final data = responseData['data'];
          if (data != null && data is Map<String, dynamic>) {
            final userProfile = UserProfileModel.fromJson(data);
            
            debugPrint('✅ 获取用户个人信息成功: ${userProfile.nickName}');
            
            return userProfile;
          } else {
            debugPrint('❌ 用户个人信息数据格式错误');
            throw Exception('用户信息数据格式错误');
          }
        } else {
          // 业务失败响应
          debugPrint('❌ 获取用户个人信息失败: $msg');
          throw Exception(msg ?? '获取用户个人信息失败');
        }
      } else {
        debugPrint('❌ 服务器响应格式错误');
        throw Exception('服务器响应格式错误');
      }
    } catch (e) {
      debugPrint('❌ 获取用户个人信息异常: $e');
      rethrow;
    }
  }
  
  /// 修改用户个人信息API
  /// 
  /// [request] 修改用户信息请求参数
  /// 直接返回更新后的UserProfileModel
  static Future<UserProfileModel> updateUserProfile(UpdateUserProfileReq request) async {
    try {
      debugPrint('🔄 开始修改用户个人信息: ${request.nickName}');
      
      // 使用DioService发送PUT请求
      final response = await _dioService.put(
        updateProfilePath,
        data: request.toJson(),
      );
      
      // 解析响应数据
      if (response.data != null && response.data is Map<String, dynamic>) {
        final responseData = response.data as Map<String, dynamic>;
        
        // 检查响应状态码
        final code = responseData['code']?.toInt() ?? 0;
        final msg = responseData['msg']?.toString();
        
        if (code == 200) {
          // 成功响应 - 解析data字段为UserProfileModel
          final data = responseData['data'];
          if (data != null && data is Map<String, dynamic>) {
            final userProfile = UserProfileModel.fromJson(data);
            
            debugPrint('✅ 修改用户信息成功: ${userProfile.nickName}');
            
            return userProfile;
          } else {
            debugPrint('❌ 用户信息数据格式错误');
            throw Exception('用户信息数据格式错误');
          }
        } else {
          // 业务失败响应
          debugPrint('❌ 修改用户信息失败: $msg');
          throw Exception(msg ?? '修改用户信息失败');
        }
      } else {
        debugPrint('❌ 服务器响应格式错误');
        throw Exception('服务器响应格式错误');
      }
    } catch (e) {
      debugPrint('❌ 修改用户信息异常: $e');
      rethrow;
    }
  }
  
  /// 上传用户头像API
  /// 
  /// [avatarFilePath] 头像文件路径
  /// 返回AvatarUploadResult包含上传结果
  static Future<AvatarUploadResult> uploadAvatar(String avatarFilePath) async {
    try {
      debugPrint('🔄 开始上传用户头像: $avatarFilePath');
      
      // 检查文件是否存在
      final file = File(avatarFilePath);
      if (!await file.exists()) {
        debugPrint('❌ 头像文件不存在');
        return AvatarUploadResult.failure('头像文件不存在');
      }
      
      // 创建FormData
      final formData = dio.FormData.fromMap({
        'avatarfile': await dio.MultipartFile.fromFile(
          avatarFilePath,
          filename: avatarFilePath.split('/').last,
        ),
      });
      
      debugPrint('🔄 发送头像上传请求');
      
      // 发送POST请求
      final response = await _dioService.post(
        uploadAvatarPath,
        data: formData,
        options: dio.Options(
          contentType: 'multipart/form-data',
        ),
      );
      
      // 解析响应数据
      if (response.data != null && response.data is Map<String, dynamic>) {
        final responseData = response.data as Map<String, dynamic>;
        
        // 检查响应状态码
        final code = responseData['code']?.toInt() ?? 0;
        final msg = responseData['msg']?.toString();
        
        if (code == 200) {
          // 成功响应 - 获取头像URL
          final imgUrl = responseData['imgUrl']?.toString();
          
          if (imgUrl != null && imgUrl.isNotEmpty) {
            debugPrint('✅ 头像上传成功: $imgUrl');
            return AvatarUploadResult.success(imgUrl);
          } else {
            debugPrint('❌ 头像上传响应中没有imgUrl');
            return AvatarUploadResult.failure('服务器响应异常');
          }
        } else {
          // 业务失败响应
          debugPrint('❌ 头像上传失败: $msg');
          return AvatarUploadResult.failure(msg ?? '上传头像失败');
        }
      } else {
        debugPrint('❌ 服务器响应格式错误');
        return AvatarUploadResult.failure('服务器响应格式错误');
      }
    } catch (e) {
      debugPrint('❌ 头像上传异常: $e');
      return AvatarUploadResult.failure('头像上传异常：${e.toString()}');
    }
  }
  
}
